package Funcionalidades.ABMCompetencia;

import Funcionalidades.Menues.*;
import Gestores.GestorCompetencia;
import Gestores.GestorUsuario;
import ActionListeners.ListarParticipantesAction;
import ActionListeners.MascaraMayusculakeyListener;

import Entidades.EntidadesDTO.CompetenciaDTO;
import Entidades.EntidadesDTO.DisponibilidadDTO;
import Entidades.EntidadesDTO.ModalidadDTO;
import Entidades.EntidadesLogica.*;



import java.awt.ComponentOrientation;
import java.awt.Dimension;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.Box;
import javax.swing.border.TitledBorder;
import javax.swing.SwingConstants;
import javax.swing.border.SoftBevelBorder;
import javax.swing.border.BevelBorder;


public class AltaCompetenciaDeportiva extends PanelGeneral {

	//Componentes de la interfaz!!
	private static final long serialVersionUID = 1L;
	private JTextField txNombre;
	private JTable tableLugares;
	private JTable tableDatosEntrada;
	private JButton btnModalidad;
	private JScrollPane scrollPaneDatosEntrada;
	private JComboBox<String> cbDeporte;

	
	//Extends!!
	private iModalidad modalidadDialog;
	private iReglamento idReglamento;
	private iBuscarLugares ilugares;
	
	
	//ATRIBUTOS DE LA CLASE!!
	private String nombreComp;
	private String deporteComp;
	private String tipoModComp;
	private int modPPG;
	private String modPermiteEmpate;
	private int modPPE;
	private int modPPPresentarse;
	private int cantSets;
	private String formaPuntuacion;
	private Vector<DisponibilidadDTO> lugares;
	private int modTantosPorAusenciaRival;
	private String modFormaPuntuacion;
	private int modCantidadSets;
	private String reglamentoComp;
	
	//Setters y Getters!!!
	
	private String getDeporteComp() {
		return deporteComp;
	}


	private void setDeporteComp(String deporteComp) {
		this.deporteComp = deporteComp;
	}


	private String getTipoModComp() {
		return tipoModComp;
	}


	private void setTipoModComp(String tipoModComp) {
		this.tipoModComp = tipoModComp;
	}


	private int getCantSets() {
		return cantSets;
	}


	private void setCantSets(int cantSets) {
		this.cantSets = cantSets;
	}


	private Vector<DisponibilidadDTO> getLugares() {
		return lugares;
	}


	private void setLugares(Vector<DisponibilidadDTO> lugares) {
		this.lugares = lugares;
	}


	private String getNombreComp() {
		return nombreComp;
	}


	private void setNombreComp(String nombreComp) {
		this.nombreComp = nombreComp;
	}


	private int getModPPG() {
		return modPPG;
	}


	private void setModPPG(int modPPG) {
		this.modPPG = modPPG;
	}


	private String isModPermiteEmpate() {
		return modPermiteEmpate;
	}


	private void setModPermiteEmpate(String modPermiteEmpate) {
		this.modPermiteEmpate = modPermiteEmpate;
	}


	private int getModPPE() {
		return modPPE;
	}


	private void setModPPE(int modPPE) {
		this.modPPE = modPPE;
	}


	private int getModPPPresentarse() {
		return modPPPresentarse;
	}


	private void setModPPPresentarse(int modPPPresentarse) {
		this.modPPPresentarse = modPPPresentarse;
	}


	private String getFormaPuntuacion() {
		return formaPuntuacion;
	}


	private void setFormaPuntuacion(String formaPuntuacion) {
		this.formaPuntuacion = formaPuntuacion;
	}


	private int getModTantosPorAusenciaRival() {
		return modTantosPorAusenciaRival;
	}


	private void setModTantosPorAusenciaRival(int modTantosPorAusenciaRival) {
		this.modTantosPorAusenciaRival = modTantosPorAusenciaRival;
	}


	private String getModFormaPuntuacion() {
		return modFormaPuntuacion;
	}


	private void setModFormaPuntuacion(String modFormaPuntuacion) {
		this.modFormaPuntuacion = modFormaPuntuacion;
	}


	private int getModCantidadSets() {
		return modCantidadSets;
	}


	private void setModCantidadSets(int modCantidadSets) {
		this.modCantidadSets = modCantidadSets;
	}


	private String getReglamentoComp() {
		return reglamentoComp;
	}


	private void setReglamentoComp(String reglamentoComp) {
		this.reglamentoComp = reglamentoComp;
	}

	//GESTORES!!
	
	private GestorCompetencia gCompetencia;
	private Vector<String> deportes;
	private GestorUsuario gUser;
	
	public AltaCompetenciaDeportiva(FrameUsuarioAutenticado framePerteneciente) {
		
		
		super(framePerteneciente);
		
		gCompetencia=gCompetencia.getGestorCompetencia();
		gUser= gUser.getGestorUsuario();
		
		try{
			deportes= gCompetencia.listar_todos_deportes();
		}
		catch(SQLException s){
			System.out.println(s.getMessage());
		}
		
		
		setPreferredSize(new Dimension(800, 500));
		setAlignmentY(1.0f);
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		setNombreCU("Dar Alta Competencia Deportiva");
		
        ImageIcon agregar= new ImageIcon(getClass().getResource("/Imagenes/imagenmas.jpg"));
		Component glueArriba = Box.createGlue();
		add(glueArriba);
		
	
		JPanel panelNombre = new JPanel();
		panelNombre.setOpaque(false);
		add(panelNombre);
		
		JLabel lblNombre = new JLabel("Nombre:");
		lblNombre.setHorizontalAlignment(SwingConstants.RIGHT);
		panelNombre.add(lblNombre);
		
		txNombre = new JTextField();
		panelNombre.add(txNombre);
		txNombre.setPreferredSize(datos);
		txNombre.addKeyListener(new MascaraMayusculakeyListener());
		
		Component horizontalStrut_1 = Box.createHorizontalStrut(20);
		panelNombre.add(horizontalStrut_1);
		
		JLabel lblDeporte = new JLabel("Deporte:");
		lblDeporte.setHorizontalAlignment(SwingConstants.RIGHT);
		panelNombre.add(lblDeporte);
		
		cbDeporte = new JComboBox<String>(deportes);
		panelNombre.add(cbDeporte);
		cbDeporte.setPreferredSize(datos);
		cbDeporte.addKeyListener(new MascaraMayusculakeyListener());
		
		Component horizontalStrut_2 = Box.createHorizontalStrut(20);
		panelNombre.add(horizontalStrut_2);
		
		JLabel lblModalidad = new JLabel("Modalidad:");
		lblModalidad.setHorizontalAlignment(SwingConstants.RIGHT);
		panelNombre.add(lblModalidad);
		
		btnModalidad = new JButton("Definir Modalidad");
		panelNombre.add(btnModalidad);
		btnModalidad.setPreferredSize(new Dimension(150, 30));
		btnModalidad.addActionListener(new btnModalidadAction());
		
		JPanel panelDatosEntrada = new JPanel();
		panelDatosEntrada.setOpaque(false);
		add(panelDatosEntrada);
		{
		
			scrollPaneDatosEntrada = new JScrollPane();
			panelDatosEntrada.add(scrollPaneDatosEntrada);
			scrollPaneDatosEntrada.setPreferredSize(new Dimension(600, 50));
	
			
			tableDatosEntrada = new JTable();
			//TODO ver la competencia de la tablemodel..
			//tableDatosEntrada.setModel(new datosCompetenciaTableModel(new Competencia()));
			tableDatosEntrada.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
			scrollPaneDatosEntrada.setViewportView(tableDatosEntrada);
			
		}
		
		JPanel panelLugares = new JPanel();
		panelLugares.setOpaque(false);
		add(panelLugares);
		
		JScrollPane scrollPaneLugares = new JScrollPane();
		scrollPaneLugares.setBorder(new TitledBorder(null, "Lugares", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelLugares.add(scrollPaneLugares);
		scrollPaneLugares.setPreferredSize(new Dimension(400, 120));
		
		tableLugares = new JTable();
		tableLugares.setModel(new lugaresCompetenciaTableModel(new Vector<DisponibilidadDTO>()));
		tableLugares.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		scrollPaneLugares.setViewportView(tableLugares);
		
		JPanel panelBotones = new JPanel();
		panelBotones.setOpaque(false);
		panelLugares.add(panelBotones);
		panelBotones.setLayout(new BoxLayout(panelBotones, BoxLayout.Y_AXIS));
		
		JButton btnAgregar = new JButton(agregar);
		btnAgregar.setMinimumSize(new Dimension(80, 60));
		btnAgregar.setMaximumSize(new Dimension(80, 60));
		btnAgregar.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
		btnAgregar.setToolTipText("Agregar-Quitar Lugar");
		btnAgregar.addActionListener(new btnAgregarLugar());
		panelBotones.add(btnAgregar);
		
		JPanel panelReglamento = new JPanel();
		panelReglamento.setOpaque(false);
		add(panelReglamento);
		
		JButton btnReglamento = new JButton("Agregar Reglamento (*)");
		panelReglamento.add(btnReglamento);
		btnReglamento.addActionListener(new agregarReglamentoAction());
		
		
		JPanel panelConfirmarDatos = new JPanel();
		panelConfirmarDatos.setOpaque(false);
		add(panelConfirmarDatos);
		
		JButton btnAceptar = new JButton("Aceptar");
		btnAceptar.setActionCommand("OK");
		panelConfirmarDatos.add(btnAceptar);
		btnAceptar.addActionListener(new aceptarAction());
		btnAceptar.setPreferredSize(new Dimension(120, 30));
		
		Component horizontalStrut = Box.createHorizontalStrut(20);
		panelConfirmarDatos.add(horizontalStrut);
		
		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.setActionCommand("Cancel");
		panelConfirmarDatos.add(btnCancelar);
		btnCancelar.setPreferredSize(new Dimension(120, 30));
		btnCancelar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){getFramePerteneciente().quitarCU();}});
		
		Component glueAbajo = Box.createGlue();
		add(glueAbajo);
		
		getObligatorios().add(txNombre);

	}
	
	

	
	public void actualizarValores(){

		
		setModPPE(modalidadDialog.getPpe());
		setModPPG(modalidadDialog.getPpg());
		setModPPPresentarse(modalidadDialog.getPpp());
		if(modalidadDialog.isEmpate())
			setModPermiteEmpate("1");
		else
			setModPermiteEmpate("0");
		setTipoModComp(modalidadDialog.getTipoModalidad());
		setModCantidadSets(modalidadDialog.getSets());
		setFormaPuntuacion(modalidadDialog.getForma());
		
		
		
	}


	public class agregarReglamentoAction extends AbstractAction{
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			if(idReglamento==null){	idReglamento= new iReglamento(getFramePerteneciente(),true);}
			idReglamento.activarDG();
			reglamentoComp=idReglamento.getReglamento();
			
		}
		
	}

	public class btnModalidadAction extends AbstractAction{

		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			if(modalidadDialog==null){	modalidadDialog= new iModalidad(getFramePerteneciente());}
			modalidadDialog.activarDG();
			actualizarValores();
			tableDatosEntrada.setModel(new datosCompetenciaTableModel());
			
			
		}

	}
	
	public class aceptarAction extends AbstractAction{


		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			if(camposObligatorios(getObligatorios()) && ilugares!=null && !ilugares.getLugaresElegidos().isEmpty()&& modalidadDialog!=null && modalidadDialog.isVerifico()){
				setNombreComp(txNombre.getText());
				setDeporteComp(cbDeporte.getSelectedItem().toString());
				setLugares(ilugares.getLugaresElegidos());
				
				ModalidadDTO md=new ModalidadDTO(getTipoModComp(), getFormaPuntuacion(), getModCantidadSets(), isModPermiteEmpate() , getModTantosPorAusenciaRival(), getModPPE(), getModPPG(), getModPPPresentarse());
				CompetenciaDTO cd= new CompetenciaDTO(getNombreComp(), getDeporteComp(), getLugares(), null, md, new Vector<Participante>(), getReglamentoComp(), null, new String("CREADA"), gUser.getUsuarioLogueado());

				System.out.println("Alta competencia deportiva: Cantidad de sets: " + md.getCantidadSets());
	
				
				try {
					Competencia competencia = gCompetencia.darAltaCompetencia(cd);
					getFramePerteneciente().cambiarCU(new listarParticipantes(getFramePerteneciente(),competencia ));

				} catch (Throwable e) {
					JOptionPane.showMessageDialog(getFramePerteneciente(), "Disculpe, No Se Pudo Ingresar La Competencia",
						    e.getMessage(),
						    JOptionPane.ERROR_MESSAGE);
				}
				
				}
		}
		
	}
	public class btnAgregarLugar extends AbstractAction{


		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			if(ilugares==null){	ilugares= new iBuscarLugares(getFramePerteneciente(),true);}
			ilugares.activarDG();
			
			lugares= ilugares.getLugaresElegidos();
			setLugares(ilugares.getLugaresElegidos());
			
			tableLugares.setModel(new lugaresCompetenciaTableModel(getLugares()));
			
		}

	}
	
	
	
	class datosCompetenciaTableModel extends MyTableModel{
		
		private static final long serialVersionUID = 1L;

		public datosCompetenciaTableModel(){
			super();
			String[] columnas={"PPG","E","PPE","PPP","Forma de Puntuacion","Sets","PAR"};
			
			Object[][] info= new Object[1][7];
			setColumnNames(columnas);
			
			info[0][0]=getModPPG();
			info[0][1]=isModPermiteEmpate();
			info[0][2]=getModPPE();
			info[0][3]=getModPPPresentarse();
			info[0][4]=getFormaPuntuacion();
			info[0][5]=getModCantidadSets();
			info[0][6]=getModTantosPorAusenciaRival();
			
			setInfo(info);
			boolean[] edits= {false,false,false,false,false};
			setEdits(edits);
			
		}
	}
	
	class lugaresCompetenciaTableModel extends MyTableModel{
		

		private static final long serialVersionUID = 1L;

		public lugaresCompetenciaTableModel(Vector<DisponibilidadDTO> vector){
			super();
			String[] columnas={"CODIGO","NOMBRE","CANTIDAD"};
			
			Object[][] info= new Object[vector.size()][3];
			setColumnNames(columnas);
			for(int i=0;i<vector.size();i++){
				info[i][0]=vector.get(i).getLugar().getCodigo();
				info[i][1]=vector.get(i).getLugar().getNombre();
				info[i][2]=vector.get(i).getCantidad();
			}
			
			setInfo(info);
			boolean[] edits= {false,false,false};
			setEdits(edits);
			
		}
	}

}

